'''
* This is the projet for Brtc LlmOps Platform
* @Author Leon-liao <liaosiliang@alltman.com>
* @Description //TODO 
* @File: 1_study_function.py
* @Time: 2025/6/28
* @All Rights Reserve By Brtc
'''
### 加法

# 计算  1+2 , 3+2 ,3+4
"""
a = 1
b = 2
print(a+b)
a = 3
b = 2
print(a+b)
a = 3
b = 4
print(a+b)
#1、 格式是 def function()
#2、 a、b 是函数的参数 在括号里面
#3、 函数是以：开始
#4、 返回结果就是return

def add(a,b):
    # 该函数的功能就是返回两个数字相加的和
    return a+b
print(add(1, 3))
print(add(2, 3))
print(add(4, 3))
"""
# 1、 无参函数
# 没有参数传递的函数叫无参函数
def get_default_server():
    return "192.168.1.1"
print(get_default_server())

#2、有参函数
# 带有参数传递的函数叫有参函数
"""
def speak_out(moneny, name):
    print(f"我的名字叫{name}， 拥有{moneny}块钱！！")
speak_out(100, "廖老师")
"""

#3、 不可变参数
"""
def chage_num(num):
    print("num:", num)
    num = 10
    print("num:", num)
a = 19
print("a:",a)
chage_num(a)
print("a:",a)
"""
# id(x) 就是打印 变量x在内存中的地址
# 不可变参数的原因是 由于 参数传递过程进行了对象拷贝， 参数已经被赋值给了另外一个对象所以 在函数里面修改参数是无效的
"""def chage_num(num):
    print(f"num:{num}, id:{id(num)}")
    num = 10
    print(f"num:{num}, id:{id(num)}")
a = 19
print(f"a:{a}, id:{id(a)}")
chage_num(a)
print(f"a:{a}, id:{id(a)}")"""

# 可变参数
"""
def chage_list(list):
    print(f"list: id: {id(list)}")
    list[0] = 1
print(f"list: id: {id(var_list)}")
print(var_list)
chage_list(var_list)
print(f"list: id: {id(var_list)}")
print(var_list)
"""


# 总结
### 在python 中  不可变参数有： int  float str  元组
### 在python 中  可变参数有 ： list   dict字典 自己定义的类(home work)

# 传递的参数 不定长参数
# 什么叫不定长参数， 就是传递的参数个数 是不确定 3 ，4 ，5
# 定义 当参数中有 *开头的参数就是不定长参数  def function(a, *b), b 会以元组的方式传递过来
"""
def unconfirm_val(a, *b):
    print(f"a:{a}")
    print(f"b:{b}")

unconfirm_val(1,2,3,4,5)

unconfirm_val(1,2,3,4,5,5,7,8,8,8)
"""
# 如果 def function(a, **b), b 会以字典的方式传递过来
"""
def unconfirm_val(a, **b):
    print(f"a:{a}")
    print(f"b:{b}")

unconfirm_val(1,x=3, y=4, z=45)

unconfirm_val(1,x=3, y=4, z=45, w=0)
"""
# 默认参数函数
# 当调用方不传参数时， 默认使用参数
"""
def default_val(name = "廖老师", money= 100):
    print(f"name:{name}, money:{money}")
default_val()
default_val(name="查无此人", money=1000)
"""
# 关键字参数
# 在Python 中参数和函数的是非常紧密的 如何保证传入的参数和调用参数 保持一致， 那么就要使用关键字参数（经常用到）
"""
def print_me(name, age):
    print(f"我的名字叫{name}, 今年{age}岁！")

print_me("廖老师", 18)
print_me(age=18, name = "廖老师")
"""

# 参数的类型指定
# 包括传入参数的类型和 返回参数的类型
"""
def print_me(name:str, age:str) ->str:
    print( "我的名字叫" + name + "今年" + age + "岁！")
    return "1000"
print("返回值：" + print_me("廖老师", "18"))
"""
# 请实现max 传入一个 list 返回这个list 中最大的元素
"""
def max_value_for_list(list_val:list)->int:
    max_value : int = 0
    for item in list_val:
        if item > max_value:
            max_value = item
    return max_value

print(f"Max Value: {max_value_for_list([3,4,1,188,999, 777,8,1,3,512,2])}")
"""
# 函数的 嵌套使用
# A 函数 使用 B函数
# 在函数中是可以 使用函数的
"""
def fun_a():
    print("func_a")
def fun_b():
    fun_a()
    print("fun_b") # ？
fun_b() # 调用函数啊
"""
# 函数是可以 作为函数的参数 被传入的， 函数是可以 当作参数的
"""
def fun_val(a, b):
    return a + b

def call_fun(a, funb):
    print(f"a:{a}")
    print(f"run func: {funb(a, 10)}")

call_fun(1, fun_val)
"""
## 函数 是可以自己调用自己的
## 函数的 递归
def fun_call_self(a):
    if a == 0:
        print(f"a = {a}")
    else:
        a = a-1
        fun_call_self(a) #自己 调自己 递归
        print(f"a = {a}")

fun_call_self(5)